Read N characters given read4()

Time: O(N); Space: O(1); easy

The API: int read4(buf) reads 4 characters at a time from a file.

The return value is the actual number of characters read. For example, it returns 3 if there is only 3 characters left in the file.

By using the read4 API, implement the function def read(buf, n) -> int that reads n characters from the file.

Note:

  • The read function will only be called once for each test case.

The read4 API is already defined for you.

[8]:
def read4(buf):
    """
    :type buf: List[char]
    :rtype: int
    """
    global file_content
    i = 0
    while i < len(file_content) and i < 4:
        buf[i] = file_content[i]
        i += 1

    if len(file_content) > 4:
        file_content = file_content[4:]
    else:
        file_content = ""
    return i
[9]:
class Solution1(object):
    def read(self, buf, n):
        """
        :type buf: List[str] - Destination buffer
        :type n:   int - Maximum number of characters to read
        :rtype:    int - The number of characters read
        """
        read_bytes = 0
        buffer = [''] * 4
        for i in range(n // 4 + 1):
            size = read4(buffer)
            if size:
                buf[read_bytes:read_bytes+size] = buffer
                read_bytes += size
            else:
                break
        return min(read_bytes, n)
[10]:
if __name__ == "__main__":
    global file_content
    buf = ['' for _ in range(100)]
    file_content = "a"
    print(buf[:Solution1().read(buf, 9)]    )
    file_content = "abcdefghijklmnop"
    print(buf[:Solution1().read(buf, 9)])
['a']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']